extends 数据基类
class_name 世界数据类

@export var id:String
@export var 世界名:String
@export var 世界介绍:String
@export var 当前区域:区域数据类:
	set(value):
		if 当前区域!=null:
			离开区域(当前区域)
		当前区域=value
		if 当前区域!=null:
			进入区域(当前区域)
		当前区域改变.emit()

@export var 全局状态列表:Dictionary={}		
@export var 状态集列表:Array[状态集类]	
@export var 角色数据:角色数据类

signal 当前区域改变

#region 初始化模型
func 初始化(数据:Dictionary):
	id=数据.id
	世界名=数据.世界名
	世界介绍=数据.世界介绍
	角色数据=角色数据类.new()
	角色数据.初始化({})
	当前区域=GameFactory.生成数据模型("区域",数据.起始区域)		
	初始化状态集列表(数据.状态集列表)
	初始化全局状态列表()

func 初始化全局状态列表():
	var 状态id列表:Array=GameData.初始数据.状态.keys()
	for 状态id in 状态id列表:
		var 状态=GameFactory.生成数据模型("状态",状态id)
		var 状态名=状态.状态名
		全局状态列表[状态名]=状态
		全局状态列表[状态名].进入阶段.connect(当进入阶段)
		全局状态列表[状态名].退出阶段.connect(当退出阶段)	
		
	for 状态名 in 状态id列表:
		全局状态列表[状态名].启动状态()

func 初始化状态集列表(状态集列表文本:String):
	var 状态集id列表=状态集列表文本.split(",",false)
	for 状态集id in 状态集id列表:
		var 状态集=GameFactory.生成数据模型("状态集",状态集id)
		状态集列表.append(状态集)
#endregion

func 当进入阶段(影响数据:Dictionary):
	执行进入阶段变化(影响数据)

func 当退出阶段(影响数据:Dictionary):
	执行退出阶段变化(影响数据)
					
func 包含状态(状态:String):
	if 全局状态列表.keys().has(状态):
		return true
	return false
	
func 获取状态(状态:String):
	if 包含状态(状态):
		return 全局状态列表[状态]
	return null

func 执行退出阶段变化(影响数据:Dictionary):
	for 状态 in 影响数据:
		if 包含状态(状态):
			for 值 in 影响数据[状态]:
				全局状态列表[状态][值]-=影响数据[状态][值]	

func 执行进入阶段变化(影响数据:Dictionary):
	for 状态 in 影响数据:
		if 包含状态(状态):
			for 值 in 影响数据[状态]:
				全局状态列表[状态][值]+=影响数据[状态][值]
		else:
			if 状态=="触发":
				print("触发",影响数据[状态])	
			else:
				print(状态,"--状态不存在")

func 执行状态变化(影响数据:Dictionary):
	for 状态 in 影响数据:
		if 包含状态(状态):
			for 值 in 影响数据[状态]:
				全局状态列表[状态][值]+=影响数据[状态][值]
		else:
			if 状态=="触发":
				print("触发",影响数据[状态])	

func 进入区域(_区域:区域数据类):
	pass
	
func 离开区域(_区域:区域数据类):
	pass
